#include "message.hpp"
#include "net.hpp"
#include "dispatcher.hpp"

// 丐版
// void onRpcRequest(const myrpc::BaseConnection::ptr& conn, myrpc::BaseMessage::ptr& msg)
// {
//     std::cout << "收到了Rpc请求";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::RpcResponse>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::RSP_RPC);
//     rpc_rsp->setRCode(myrpc::RCode::RCODE_OK);
//     rpc_rsp->setResult(33);
//     conn->send(rpc_rsp);
// }
// void onTopicRequest(const myrpc::BaseConnection::ptr& conn, myrpc::BaseMessage::ptr& msg)
// {
//     std::cout << "收到了Topic请求";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::TopicResponse>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::RSP_TOPIC);
//     rpc_rsp->setRCode(myrpc::RCode::RCODE_OK);
//     conn->send(rpc_rsp);
// }
// int main()
// {
//     auto dispather = std::make_shared<myrpc::Dispatcher>();

//     dispather->registerHandler(myrpc::MType::REQ_RPC, onRpcRequest);   // 注册映射关系
//     dispather->registerHandler(myrpc::MType::REQ_TOPIC, onTopicRequest);

//     auto server = myrpc::ServerFactory::create(9090);
//     auto message_cb = std::bind(&myrpc::Dispatcher::onMessage, dispather.get(), 
//         std::placeholders::_1, std::placeholders::_2);
//     server->setMessageCallback(message_cb);//？
//     server->start();
//     return 0;
// }


// 高配版
// myrpc::RpcRequest::ptr& msg：用子类对象类型才可以更加清晰的访问所有内容
// 但是这样会导致消息类型不一致,这样就没办法注册映射关系了
// 所以我们将Dispatcher::registerHandler设置为模板函数
// 但是又有一个问题handler是一个容器，只能存储相同类型的参数
// 我们使用一个纯虚基类将回调函数onMessage设置在里面，再让一个特定类型的子类继承这个基类
// 并重写onMessage，在容器中只存储相同类型的基类指针，这样就会形成多态，满足不同类型的消息类型需求
// void onRpcRequest(const myrpc::BaseConnection::ptr& conn, myrpc::RpcRequest::ptr& msg)
// {
//     std::cout << "收到了Rpc请求";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
//     std::cout << "method:" << msg->method() << std::endl;   //
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::RpcResponse>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::RSP_RPC);
//     rpc_rsp->setRCode(myrpc::RCode::RCODE_OK);
//     rpc_rsp->setResult(33);
//     conn->send(rpc_rsp);
// }
// void onTopicRequest(const myrpc::BaseConnection::ptr& conn, myrpc::TopicRequest::ptr& msg)
// {
//     std::cout << "收到了Topic请求";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::TopicResponse>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::RSP_TOPIC);
//     rpc_rsp->setRCode(myrpc::RCode::RCODE_OK);
//     conn->send(rpc_rsp);
// }

// int main()
// {
//     auto dispather = std::make_shared<myrpc::Dispatcher>();

//     dispather->registerHandler<myrpc::RpcRequest>(myrpc::MType::REQ_RPC, onRpcRequest);   // 注册映射关系
//     dispather->registerHandler<myrpc::TopicRequest>(myrpc::MType::REQ_TOPIC, onTopicRequest);

//     auto server = myrpc::ServerFactory::create(9090);
//     auto message_cb = std::bind(&myrpc::Dispatcher::onMessage, dispather.get(), 
//         std::placeholders::_1, std::placeholders::_2);
//     server->setMessageCallback(message_cb);//？
//     server->start();
//     return 0;
// }